package cn.dglydrpy.study.basemodule.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 数据库映射对象
 */
@Data //生成get(),set(),equals(),hashcode(),toString()
@NoArgsConstructor //生成无参构造
@AllArgsConstructor //全参构造

/**
 * ActiveRecord也属于ORM（对象关系映射）层，由Rails最早提出，遵循标准的ORM模型：表映射
 * 到记录，记录映射到对象，字段映射到对象属性。配合遵循的命名和配置惯例，能够很大程度的快
 * 速实现模型的操作，而且简洁易懂。
 *
 * ActiveRecord的主要思想是：
 * 每一个数据库表对应创建一个类，类的每一个对象实例对应于数据库中表的一行记录；通常
 * 表的每个字段在类中都有相应的Field；
 * ActiveRecord同时负责把自己持久化，在ActiveRecord中封装了对数据库的访问，即CURD;
 * ActiveRecord是一种领域模型(Domain Model)，封装了部分业务逻辑；
 *
 * extends Model<MyBaseEntity>  开启AR模式
 */
public class MyBaseEntity extends Model<MyBaseEntity> implements Serializable {

    // 全局开启驼峰和_转化 不需要单独再配置转化
    private String createdUser;

    private String createdTime;

    private String lastModifiedUser;

    private String lastModifiedTime;

    // 乐观锁版本号 新增时默认填充
    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;

    // 逻辑删除标志
    /**
     * 开发系统时，有时候在实现功能时，删除操作需要实现逻辑删除，所谓逻辑删除就是将数据标记为删除(update)，而并非真正的物理删除（非DELETE操作），
     * 查询时需要携带状态条件，确保被标记的数据不被查询到。这样做的目的就是避免数据被真正的删除。
     */
    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;
}
